Optimize gtk_css_node_declaration_has_class
authorMatthias Clasen <mclasen@redhat.com>
Wed, 9 Sep 2015 18:40:36 +0000 (14:40 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Wed, 9 Sep 2015 18:40:36 +0000 (14:40 -0400)
This function is getting called a lot. Statistics for the gtk3-demo
listbox example show most calls with 0-4 classes. Unrolling the cases
a bit brings the instruction count in callgrind from 93M to 52M.

gtk/gtkcssnodedeclaration.c

index 989ad94fd463bfdb47b7e292ed79ec12b9676da7..221faef7b0c2979b6b011eb4c2e876f52451cbab 100644 (file)
@@ -311,7 +311,28 @@ gboolean
 gtk_css_node_declaration_has_class (const GtkCssNodeDeclaration *decl,
                                     GQuark                       class_quark)
 {
-  return find_class (decl, class_quark, NULL);
+  GQuark *classes = get_classes (decl);
+
+  switch (decl->n_classes)
+    {
+    case 3:
+      if (classes[2] == class_quark)
+        return TRUE;
+
+    case 2:
+      if (classes[1] == class_quark)
+        return TRUE;
+
+    case 1:
+      if (classes[0] == class_quark)
+        return TRUE;
+
+    case 0:
+      return FALSE;
+
+    default:
+      return find_class (decl, class_quark, NULL);
+    }
 }
 
 GList *